package frsf.cidisi.exercise.idemiatp.search.actions;

import frsf.cidisi.exercise.idemiatp.search.*;
import frsf.cidisi.faia.agent.search.SearchAction;
import frsf.cidisi.faia.agent.search.SearchBasedAgentState;
import frsf.cidisi.faia.state.AgentState;
import frsf.cidisi.faia.state.EnvironmentState;

public class TomarCofre extends SearchAction {

    /**
     * This method updates a tree node state when the search process is running.
     * It does not updates the real world state.
     */
    @Override
    public SearchBasedAgentState execute(SearchBasedAgentState s) {
        StateArquelogo agState = (StateArquelogo) s;
        
        String stringCiudad = agState.getPosicion();
        Ciudad ciudadActual = agState.getMapa().getCiudad(stringCiudad);
        
        if(ciudadActual.getTesoro().getValor() != 0){
        	
        agState.setValorTesoro(agState.getValorTesoro()+ciudadActual.getTesoro().getValor());
        agState.setPeso(agState.getPeso() + ciudadActual.getTesoro().getPeso());
        ciudadActual.getTesoro().vaciarTesoro();
        
        return agState;
        }
        
        return null;
    }

    /**
     * This method updates the agent state and the real world state.
     */
    @Override
    public EnvironmentState execute(AgentState ast, EnvironmentState est) {
        StateIsla environmentState = (StateIsla) est;
        StateArquelogo agState = ((StateArquelogo) ast);

        String stringCiudad = agState.getPosicion();
        Ciudad ciudadActual = agState.getMapa().getCiudad(stringCiudad);
        
        Ciudad ciudadEntorno = environmentState.getMapa().getCiudad(environmentState.getPosicionArquelogo());
        
        if (ciudadEntorno.getTesoro().getValor() != 0) {
        	
        	float peso = agState.getPeso();
            Tesoro tesoro = ciudadEntorno.getTesoro();
            if((peso+tesoro.getPeso()) <= 450 && tesoro.getPeso() != 0){ //Verifico si el tesoro se puede juntar y si no esta vacio(Profanado)
        		agState.setValorTesoro(agState.getValorTesoro() + tesoro.getValor());
        		agState.setPeso(peso + tesoro.getPeso());}
            
            
        	//agState.getCiudadesVisitadas().add("Toma el tesoro");
            // Update the real world
            
        	ciudadEntorno.getTesoro().vaciarTesoro();
        	
            // Update the agent state
        	
        	ciudadActual.getTesoro().vaciarTesoro();
            
            return environmentState;
        }

        return null;
    }

    /**
     * This method returns the action cost.
     */
    @Override
    public Double getCost() {
        return new Double(0);
    }

    /**
     * This method is not important for a search based agent, but is essensial
     * when creating a calculus based one.
     */
    @Override
    public String toString() {
        return "TomarCofre";
    }
}